package com.unionpay.upyzt.model;

import com.unionpay.upyzt.exception.UpyztException;
import com.unionpay.upyzt.net.APIResource;
import com.unionpay.upyzt.net.RequestOptions;
import com.unionpay.upyzt.resp.ElectronicReceiptResp;
import lombok.experimental.Accessors;

import java.util.Map;

/**
 * 电子回单
 * <p>
 * 电子回单请求前请确保交易已经成功且对账完成（一般为 T+1 日对账完成）
 * 电子回单会在第一次请求时会生成，若未同步生成成功（返回状态为 processing）时，可以过一段时间请求任意查询接口获得最终状态
 */
@Accessors(chain = true)
public class ElectronicReceipt extends APIResource {

    /**
     * 电子回单查询（系统订单号）
     *
     * @param id 系统订单号
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public static ElectronicReceiptResp retrieveById(String id) throws UpyztException {
        return retrieveById(id, null);
    }

    /**
     * 电子回单查询（系统订单号）
     *
     * @param id      系统订单号
     * @param options 参数选项
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public static ElectronicReceiptResp retrieveById(String id, RequestOptions options) throws UpyztException {
        return APIResource.request(RequestMethod.GET, instanceURL(ElectronicReceipt.class, id), null, ElectronicReceiptResp.class, options);
    }

    /**
     * 电子回单查询（交易的系统订单号）
     *
     * @param tradeId 交易的系统订单号
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public static ElectronicReceiptResp retrieveByTradeId(String tradeId) throws UpyztException {
        return retrieveByTradeId(tradeId, null);
    }

    /**
     * 电子回单查询（系统订单号）
     *
     * @param tradeId 交易的系统订单号
     * @param options 参数选项
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public static ElectronicReceiptResp retrieveByTradeId(String tradeId, RequestOptions options) throws UpyztException {
        return APIResource.request(RequestMethod.GET, instanceURL(ElectronicReceipt.class, "_by_trade_id", tradeId), null, ElectronicReceiptResp.class, options);
    }

    /**
     * 电子回单查询（平台订单号和交易类型）
     *
     * @param tradeOutOrderNo 交易的平台订单号
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public static ElectronicReceiptResp retrieveByTradeOutOrderNo(String tradeOutOrderNo, Map<String, Object> params) throws UpyztException {
        return retrieveByTradeOutOrderNo(tradeOutOrderNo, params, null);
    }

    /**
     * 电子回单查询（平台订单号和交易类型）
     *
     * @param tradeOutOrderNo 交易的平台订单号
     * @param options         参数选项
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public static ElectronicReceiptResp retrieveByTradeOutOrderNo(String tradeOutOrderNo, Map<String, Object> params, RequestOptions options) throws UpyztException {
        return APIResource.request(RequestMethod.GET, instanceURL(ElectronicReceipt.class, "_by_out_order_no", tradeOutOrderNo), params, ElectronicReceiptResp.class, options);
    }
}
